#include "udp_communication.hpp"  // 引入 UDP 通信头文件
#include <asio.hpp>               // 引入 ASIO 库
#include <iostream>               // 引入输入输出流
#include <string>                 // 引入字符串库

using asio::ip::udp;  // 使用 UDP 协议

// 构造函数：初始化 UDP 套接字、目标地址和本地端口
UDPCommunicationClient::UDPCommunicationClient(asio::io_context& io_context, unsigned short local_port, const std::string& target_ip, unsigned short target_port)
    : io_context_(io_context), socket_(io_context, udp::endpoint(udp::v4(), local_port)) {
    target_endpoint_ = udp::endpoint(asio::ip::address::from_string(target_ip), target_port);
    local_endpoint_ = socket_.local_endpoint();  // 获取本地端点
}

// 启动通信：发送和接收消息
void UDPCommunicationClient::start() {
    std::cout << "UDP communication started on " << local_endpoint_ << std::endl;

    // 发送测试消息
    send_message("test message");

    // 开始接收来自 B 的消息
    receive_message();

    while (true) {
        std::string message;
        std::cout << "Enter message to send: ";
        std::getline(std::cin, message);
        send_message(message);
        receive_message();
    }
}

// 发送消息到目标
void UDPCommunicationClient::send_message(const std::string& message) {
    socket_.send_to(asio::buffer(message), target_endpoint_);
    std::cout << "Sent message to " << target_endpoint_ << ": " << message << std::endl;
}

// 接收来自目标的消息
void UDPCommunicationClient::receive_message() {
    char buffer[1024];            // 接收数据的缓冲区
    udp::endpoint sender_endpoint;  // 发送方的地址和端口

    // 等待接收消息
    size_t len = socket_.receive_from(asio::buffer(buffer), sender_endpoint);

    std::cout << "Received message from " << sender_endpoint << ": " << std::string(buffer, len) << std::endl;
}
